home *** CD-ROM | disk | FTP | other *** search
/ Turnbull China Bikeride / Turnbull China Bikeride - Disc 2.iso / STUTTGART / TEX-UTIL / DVIVIEW / TEXFONTS5 / !TeXFonts / NotRISCOS / sym / mf
Text File  |  1988-02-26  |  18KB  |  448 lines

  1. % This is SYM.MF in text format, as of Mar 31, 1986.
  2. % This file generates the following characters when their codes are known:
  3. % |minus|, |plus_minus|, |o_plus|, |o_times|,
  4. % |cup|, |cap|, |meet|, |join|,
  5. % |down_arrow|, |up_arrow|,
  6. % |left_arrow|, |right_arrow|, |double_arrow|,
  7. % |subset|, |superset|, |elt|,
  8. % |for_all|, |there_exists|, |false_that|,
  9. % |less|, |greater|, |underbar|,
  10. % |neq|, |leq|, |geq|, |eqv|,
  11. % |backslash|, |vertical|,
  12. % |cdot|, |diamond|,
  13. % |left_brace|, |right_brace|,
  14. % |straight_quotes|, |infty|, |integral|.
  15.  
  16. iff known minus: cmchar "Minus sign";
  17. beginarithchar(minus); pickup rule.nib;
  18. lft x1=hround 1.5u-eps; x2=w-x1; y1=y2=math_axis;
  19. draw z1--z2;  % bar
  20. labels(1,2); endchar;
  21.  
  22. iff known plus_minus: cmchar "Plus-or-minus sign";
  23. beginarithchar(plus_minus); pickup rule.nib;
  24. numeric shiftup; shiftup=vround 1.5u;
  25. x1=x2=.5w; lft x3=lft=x5=hround u-eps; x4=x6=w-x3;
  26. .5[y1,y2]=y3=y4=math_axis+shiftup; top y1=h+shiftup; y5=y6=y2;
  27. draw z1--z2;  % stem
  28. draw z3--z4;  % plus bar
  29. draw z5--z6;  % minus bar
  30. labels(1,2,3,4,5,6); endchar;
  31.  
  32. iff known o_plus: cmchar "Circle-plus operator";
  33. beginarithchar(o_plus); pickup light_rule.nib; autorounded;
  34. lft x6=hround u; x2=w-x6; y2=math_axis; top y8=h;
  35. circle_points; draw_circle;  % circle
  36. draw z2--z6; draw z4--z8;  % bar and stem
  37. labels(1,2,3,4,5,6,7,8); endchar;
  38.  
  39. iff known o_times: cmchar "Circle-times operator";
  40. beginarithchar(o_times); pickup light_rule.nib; autorounded;
  41. lft x6=hround u; x2=w-x6; y2=math_axis; top y8=h;
  42. circle_points; draw_circle;  % circle
  43. draw z1--z5; draw z3--z7;  % diagonals
  44. labels(1,2,3,4,5,6,7,8); endchar;
  45.  
  46. iff known cup: cmchar "Set union sign";
  47. beginchar(cup,12u#,.8asc_height#,0);
  48. italcorr .8asc_height#*slant-.5u#;
  49. adjust_fit(0,0); pickup rule.nib; autorounded;
  50. lft x1=hround u; x2=x1; x3=w-x3; x4=x5=w-x1;
  51. y1=good.y h+o; bot y3=-o; y2=y4=2/3[y1,y3]; y5=y1;
  52. draw z1---z2...z3...z4---z5;  % stems and cup
  53. labels(1,2,3,4,5); endchar;
  54.  
  55. iff known cap: cmchar "Set intersection sign";
  56. beginchar(cap,12u#,.8asc_height#,0);
  57. italcorr .8asc_height#*slant-.5u#;
  58. adjust_fit(0,0); pickup rule.nib; autorounded;
  59. lft x1=hround u; x2=x1; x3=w-x3; x4=x5=w-x1;
  60. y3=good.y h+o; bot y1=-o; y2=y4=2/3[y1,y3]; y5=y1;
  61. draw z1---z2...z3...z4---z5;  % stems and cap
  62. labels(1,2,3,4,5); endchar;
  63.  
  64. iff known meet: cmchar "Lattice infimum (logical and) sign";
  65. beginchar(meet,12u#,.8asc_height#,0);
  66. italcorr .8asc_height#*slant-.5u#;
  67. adjust_fit(0,0); pickup rule.nib;
  68. lft x1=hround u-eps; x3=w-x3; x5=w-x1;
  69. y3=good.y h+o; bot y1=-o; y5=y1;
  70. draw z1--z3--z5;  % diagonals
  71. labels(1,3,5); endchar;
  72.  
  73. iff known join: cmchar "Lattice supremum (logical or) sign";
  74. beginchar(join,12u#,.8asc_height#,0);
  75. italcorr .8asc_height#*slant-.5u#;
  76. adjust_fit(0,0); pickup rule.nib;
  77. lft x1=hround u-eps; x3=w-x3; x5=w-x1;
  78. y1=good.y h+o; bot y3=-o; y5=y1;
  79. draw z1--z3--z5;  % diagonals
  80. labels(1,3,5); endchar;
  81.  
  82. iff known down_arrow: cmchar "Downward arrow";
  83. beginchar(down_arrow,9u#,asc_height#,asc_depth#);
  84. adjust_fit(0,0); pickup crisp.nib;
  85. pos1(rule_thickness,0); pos2(rule_thickness,0);
  86. pos3(bar,90); pos4(bar,90);
  87. lft x1l=hround(.5w-.5rule_thickness); y1+.5rule_thickness=h;
  88. x0=x1=x2; bot y0=-d; x0-x3=x4-x0=3u+eps;
  89. y3=y4=y0+.24asc_height+eps;
  90. pos5(bar,angle(z4-z0)); z5l=z0;
  91. pos6(bar,angle(z3-z0)); z6l=z0;
  92. z9=.381966[.5[z3,z4],z0];
  93. numeric t; path p; p=z4r{z9-z4}..z6r;
  94. t=xpart(p intersectiontimes((x2r,-d)--(x2r,h))); y2=ypart point t of p;
  95. filldraw z0..{z4-z9}z4l--subpath (0,t) of\\(z4r{z9-z4}..z6r)
  96.  --z2r---z1r..z1l---z2l--subpath (t,0) of\\(z3r{z9-z3}..z5r)
  97.  --z3l{z9-z3}..z0 & cycle;  % arrowhead and stem
  98. penlabels(0,1,2,3,4,5,6,9); endchar;
  99.  
  100. iff known up_arrow: cmchar "Upward arrow";
  101. beginchar(up_arrow,9u#,asc_height#,asc_depth#);
  102. italcorr .76asc_height#*slant+.5crisp#-u#;
  103. adjust_fit(0,0); pickup crisp.nib;
  104. pos1(rule_thickness,0); pos2(rule_thickness,0);
  105. pos3(bar,90); pos4(bar,90);
  106. lft x1l=hround(.5w-.5rule_thickness); y1-.5rule_thickness=-d;
  107. x0=x1=x2; top y0=h; x0-x3=x4-x0=3u+eps;
  108. y3=y4=y0-.24asc_height-eps;
  109. pos5(bar,angle(z4-z0)); z5l=z0;
  110. pos6(bar,angle(z3-z0)); z6l=z0;
  111. z9=.381966[.5[z3,z4],z0];
  112. numeric t; path p; p=z4l{z9-z4}..z6r;
  113. t=xpart(p intersectiontimes((x2r,-d)--(x2r,h))); y2=ypart point t of p;
  114. filldraw z0..{z4-z9}z4r--subpath (0,t) of\\(z4l{z9-z4}..z6r)
  115.  --z2r---z1r..z1l---z2l--subpath (t,0) of\\(z3l{z9-z3}..z5r)
  116.  --z3r{z9-z3}..z0 & cycle;  % arrowhead and stem
  117. penlabels(0,1,2,3,4,5,6,9); endchar;
  118.  
  119. iff known left_arrow: cmchar "Leftward arrow";
  120. compute_spread(.45x_height#,.55x_height#);
  121. beginchar(left_arrow,18u#,v_center(spread#+rule_thickness#));
  122. adjust_fit(0,0); pickup crisp.nib;
  123. pos1(rule_thickness,90); pos2(rule_thickness,90); pos3(bar,0); pos4(bar,0);
  124. y0=y1=y2=math_axis; x1+.5rule_thickness=hround(w-u); lft x0=hround u;
  125. y3-y0=y0-y4=.24asc_height+eps; x3=x4=x0+3u+eps;
  126. pos5(bar,angle(z4-z0)); z5l=z0; pos6(bar,angle(z3-z0)); z6l=z0;
  127. z9=.381966[.5[z3,z4],z0];
  128. numeric t; path p; p=z4r{z9-z4}..z6r;
  129. t=xpart(p intersectiontimes((0,y2l)--(w,y2l))); x2=xpart point t of p;
  130. filldraw z0..{z4-z9}z4l--subpath (0,t) of\\(z4r{z9-z4}..z6r)
  131.  --z2l---z1l..z1r---z2r--subpath (t,0) of\\(z3r{z9-z3}..z5r)
  132.  --z3l{z9-z3}..z0 & cycle;  % arrowhead and stem
  133. penlabels(0,1,2,3,4,5,6,9); endchar;
  134.  
  135. iff known right_arrow: cmchar "Rightward arrow";
  136. compute_spread(.45x_height#,.55x_height#);
  137. beginchar(right_arrow,18u#,v_center(spread#+rule_thickness#));
  138. adjust_fit(0,0); pickup crisp.nib;
  139. pos1(rule_thickness,90); pos2(rule_thickness,90); pos3(bar,0); pos4(bar,0);
  140. y0=y1=y2=math_axis; x1-.5rule_thickness=hround u; rt x0=hround(w-u);
  141. y3-y0=y0-y4=.24asc_height+eps; x3=x4=x0-3u-eps;
  142. pos5(bar,angle(z4-z0)); z5l=z0; pos6(bar,angle(z3-z0)); z6l=z0;
  143. z9=.381966[.5[z3,z4],z0];
  144. numeric t; path p; p=z4l{z9-z4}..z6r;
  145. t=xpart(p intersectiontimes((0,y2l)--(w,y2l))); x2=xpart point t of p;
  146. filldraw z0..{z4-z9}z4r--subpath (0,t) of\\(z4l{z9-z4}..z6r)
  147.  --z2l---z1l..z1r---z2r--subpath (t,0) of\\(z3l{z9-z3}..z5r)
  148.  --z3r{z9-z3}..z0 & cycle;  % arrowhead and stem
  149. penlabels(0,1,2,3,4,5,6,9); endchar;
  150.  
  151. iff known double_arrow: cmchar "Left-and-right arrow";
  152. compute_spread(.45x_height#,.55x_height#);
  153. beginchar(double_arrow,18u#,
  154.  v_center(if monospace:.6asc_height#+fi spread#+rule_thickness#));
  155. adjust_fit(0,0); pickup crisp.nib;
  156. pos1(rule_thickness,90); pos2(rule_thickness,90); pos3(bar,0); pos4(bar,0);
  157. y0=y1=y2=math_axis if monospace:+vround.3asc_height fi; lft x0=hround u;
  158. if monospace: x1+.5rule_thickness=hround(w-u) else: x1=.5w fi;
  159. y3-y0=y0-y4=.24asc_height+eps; x3=x4=x0+3u+eps;
  160. pos5(bar,angle(z4-z0)); z5l=z0; pos6(bar,angle(z3-z0)); z6l=z0;
  161. z9=.381966[.5[z3,z4],z0];
  162. numeric t; path p; p=z4r{z9-z4}..z6r;
  163. t=xpart(p intersectiontimes((0,y2l)--(w,y2l))); x2=xpart point t of p;
  164. filldraw z0..{z4-z9}z4l--subpath (0,t) of\\(z4r{z9-z4}..z6r)
  165.  --z2l---z1l..z1r---z2r--subpath (t,0) of\\(z3r{z9-z3}..z5r)
  166.  --z3l{z9-z3}..z0 & cycle;  % left arrowhead and stem
  167. pos11(rule_thickness,90); pos12(rule_thickness,90); pos13(bar,0); pos14(bar,0);
  168. y10=y11=y12=math_axis if monospace:-vround.3asc_height fi;
  169. rt x10=hround(w-u);
  170. if monospace: x11-.5rule_thickness=hround u else: x11=.5w fi;
  171. y13-y10=y10-y14=.24asc_height+eps; x13=x14=x10-3u-eps;
  172. pos15(bar,angle(z14-z10)); z15l=z10; pos16(bar,angle(z13-z10)); z16l=z10;
  173. z19=.381966[.5[z13,z14],z10];
  174. numeric t; path p; p=z14l{z19-z14}..z16r;
  175. t=xpart(p intersectiontimes((0,y12l)--(w,y12l))); x12=xpart point t of p;
  176. filldraw z10..{z14-z19}z14r--subpath (0,t) of\\(z14l{z19-z14}..z16r)
  177.  --z12l---z11l..z11r---z12r--subpath (t,0) of\\(z13l{z19-z13}..z15r)
  178.  --z13r{z19-z13}..z10 & cycle;  % right arrowhead and stem
  179. penlabels(0,1,2,3,4,5,6,9,10,11,12,13,14,15,16,19); endchar;
  180.  
  181. iff known subset: cmchar "Proper subset sign";
  182. compute_spread(5/4x_height#,3/2x_height#);
  183. beginchar(subset,14u#,v_center(spread#+rule_thickness#));
  184. italcorr h#*slant-u#;
  185. adjust_fit(0,0); pickup rule.nib; autorounded;
  186. lft x2=hround 1.5u-eps; x1=x3=w-x2;
  187. y1-y3=spread; y2=.5[y1,y3]=math_axis;
  188. x4=x5=.5w; y4=y1; y5=y3;
  189. draw z1---z4...z2{down}...z5---z3;  % arc and bars
  190. labels(1,2,3,4,5); endchar;
  191.  
  192. iff known superset: cmchar "Proper superset sign";
  193. compute_spread(5/4x_height#,3/2x_height#);
  194. beginchar(superset,14u#,v_center(spread#+rule_thickness#));
  195. italcorr h#*slant-u#;
  196. adjust_fit(0,0); pickup rule.nib; autorounded;
  197. lft x1=hround 1.5u-eps; x2=w-x1; x3=x1;
  198. y1-y3=spread; y2=.5[y1,y3]=math_axis;
  199. x4=x5=.5w; y4=y1; y5=y3;
  200. draw z1---z4...z2{down}...z5---z3;  % arc and bars
  201. labels(1,2,3,4,5); endchar;
  202.  
  203. iff known elt: cmchar "Element sign";
  204. compute_spread(5/4x_height#,3/2x_height#);
  205. beginchar(elt,12u#,v_center(spread#+rule_thickness#));
  206. italcorr h#*slant-u#;
  207. adjust_fit(0,0); pickup rule.nib; autorounded;
  208. lft x2=hround 1.5u-eps; x1=x3=x6=w-x2;
  209. y1-y3=spread; y2=y6=.5[y1,y3]=math_axis;
  210. x4=x5=.5w+u; y4=y1; y5=y3;
  211. draw z1---z4...z2{down}...z5---z3;  % arc and bars
  212. draw z2--z6;  % middle bar
  213. labels(1,2,3,4,5,6); endchar;
  214.  
  215. iff known for_all: cmchar "Universal quantifier";
  216. beginchar(for_all,10u#,asc_height#,0);
  217. italcorr asc_height#*slant;
  218. adjust_fit(0,0); pickup rule.nib;
  219. x2=good.x .5w; w:=r:=2x2;
  220. lft x1=0; x3=w-x1;
  221. top y1=h; bot y2=-o; y3=y1; y4=y5=good.y x_height;
  222. z4=whatever[z1,z2]; z5=whatever[z2,z3];
  223. draw z1--z2--z3;  % diagonals
  224. draw z4--z5;  % bar
  225. labels(1,2,3,4,5); endchar;
  226.  
  227. iff known there_exists: cmchar "Existential quantifier";
  228. beginchar(there_exists,10u#,asc_height#,0);
  229. italcorr asc_height#*slant;
  230. adjust_fit(0,0); pickup rule.nib;
  231. lft x1=hround u-eps; x2=x3=x5=w-x1; x4=x6-.25u=x1;
  232. top y1=h; bot y4=0; y2=y1; y5=y6=.5[y1,y3]; y3=y4;
  233. draw z1--z2--z3--z4;  % upper bar, stem, lower bar
  234. draw z5--z6;  % middle bar
  235. labels(1,2,3,4,5,6); endchar;
  236.  
  237. iff known false_that: cmchar "Logical not sign";
  238. beginchar(false_that,12u#,x_height#,0);
  239. italcorr x_height#*slant-.5u#;
  240. adjust_fit(0,0); pickup rule.nib;
  241. lft x1=hround u-eps; x2=x3=w-x1;
  242. y1=y2=good.y .5[bar_height,h]; y2-y3=1.2(h-bar_height);
  243. draw z1--z2--z3;  % bar and stem
  244. labels(1,2,3); endchar;
  245.  
  246. iff known less: cmchar "Less than sign";
  247. compute_spread(5/4x_height#,3/2x_height#);
  248. beginchar(less,14u#,v_center(spread#+rule_thickness#));
  249. italcorr h#*slant-u#;
  250. adjust_fit(0,0); pickup rule.nib;
  251. lft x2=hround 1.5u-eps; x1=x3=w-x2;
  252. y1-y3=spread; y2=.5[y1,y3]=math_axis;
  253. draw z1--z2--z3;  % diagonals
  254. labels(1,2,3); endchar;
  255.  
  256. iff known greater: cmchar "Greater than sign";
  257. compute_spread(5/4x_height#,3/2x_height#);
  258. beginchar(greater,14u#,v_center(spread#+rule_thickness#));
  259. italcorr math_axis#*slant-u#;
  260. adjust_fit(0,0); pickup rule.nib;
  261. rt x2=hround(w-1.5u)+eps; x1=x3=w-x2;
  262. y1-y3=spread; y2=.5[y1,y3]=math_axis;
  263. draw z1--z2--z3;  % diagonals
  264. labels(1,2,3); endchar;
  265.  
  266. iff known underbar: cmchar "Underbar suitable for < and >";
  267. compute_spread((5/8+.45)*x_height#,(3/4+.55)*x_height#);
  268. beginchar(underbar,14u#,0,spread#-math_axis#+.5rule_thickness#);
  269. adjust_fit(0,0); pickup rule.nib;
  270. lft x1=hround 1.5u-eps; x2=w-x1; bot y1=bot y2=-d;
  271. draw z1--z2;  % bar
  272. labels(1,2); endchar;
  273.  
  274. iff known neq: cmchar "Unequals sign";
  275. compute_spread(.45x_height#,.55x_height#);
  276. beginchar(neq,14u#,v_center(4spread#+rule_thickness#));
  277. italcorr h#*slant-.5u#;
  278. adjust_fit(0,0); pickup rule.nib;
  279. lft x1=hround u-eps; x3=x1; x2=x4=w-x1;
  280. y1=y2; y3=y4; y1-y3=spread; .5[y1,y3]=math_axis;
  281. draw z1--z2; draw z3--z4;  % bars
  282. lft x6=hround 3.5u-eps; x5=w-x6; top y5=h+o; bot y6=-d-o;
  283. draw z5--z6;  % diagonal
  284. labels(1,2,3,4,5,6); endchar;
  285.  
  286. iff known leq: cmchar "Less than or equal to sign";
  287. compute_spread(.45x_height#,.55x_height#);
  288. spread#':=spread#; spread':=spread; % the spread of `$=$'
  289. compute_spread(5/4x_height#,3/2x_height#);
  290. beginchar(leq,14u#,v_center(spread#'+spread#+rule_thickness#));
  291. italcorr h#*slant-u#;
  292. adjust_fit(0,0); pickup rule.nib;
  293. lft x2=hround 1.5u-eps; x1=x3=w-x2;
  294. y1-y3=spread; y2=.5[y1,y3]; top y1=h;
  295. draw z1--z2--z3;  % diagonals
  296. x8=x1; x9=x2; y8=y9; y3-y9=spread'; draw z8--z9;  % bar
  297. labels(1,2,3,8,9); endchar;
  298.  
  299. iff known geq: cmchar "Greater than or equal to sign";
  300. compute_spread(.45x_height#,.55x_height#);
  301. spread#':=spread#; spread':=spread; % the spread of `$=$'
  302. compute_spread(5/4x_height#,3/2x_height#);
  303. beginchar(geq,14u#,v_center(spread#'+spread#+rule_thickness#));
  304. italcorr h#*slant-u#;
  305. adjust_fit(0,0); pickup rule.nib;
  306. lft x1=hround 1.5u-eps; x2=w-x1; x3=x1;
  307. y1-y3=spread; y2=.5[y1,y3]; top y1=h;
  308. draw z1--z2--z3;  % diagonals
  309. x8=x1; x9=x2; y8=y9; y3-y9=spread'; draw z8--z9;  % bar
  310. labels(1,2,3,8,9); endchar;
  311.  
  312. iff known eqv: cmchar "Equivalence or congruence sign";
  313. compute_spread(.45x_height#,.55x_height#);
  314. beginchar(eqv,14u#,v_center(2spread#+rule_thickness#));
  315. italcorr h#*slant-.5u#;
  316. adjust_fit(0,0); pickup rule.nib;
  317. lft x1=hround u-eps; x3=x5=x1; x2=x4=x6=w-x1;
  318. y1=y2; y3=y4=math_axis; y5=y6; y1-y3=y3-y5=spread;
  319. draw z1--z2;  % upper bar
  320. draw z3--z4;  % middle bar
  321. draw z5--z6;  % lower bar
  322. labels(1,2,3,4,5,6); endchar;
  323.  
  324. iff known backslash: cmchar "Reverse slash (backslash)";
  325. beginchar(backslash,9u#,body_height#,paren_depth#);
  326. adjust_fit(0,0); pickup rule.nib;
  327. lft x1=hround u-eps; top y1=h+eps;
  328. rt x2=hround(w-u)+eps; bot y2=-d-eps;
  329. draw z1--z2;  % diagonal
  330. labels(1,2); endchar;
  331.  
  332. iff known vertical: cmchar "Vertical line";
  333. beginchar(vertical,5u#,body_height#,paren_depth#);
  334. italcorr body_height#*slant+.5rule_thickness#-2u#;
  335. adjust_fit(0,0); pickup rule.nib;
  336. x1=x2=good.x .5w; top y1=h+eps; bot y2=-d-eps;
  337. draw z1--z2;  % stem
  338. labels(1,2); endchar;
  339.  
  340. iff known cdot: cmchar "Period raised to axis height";
  341. beginchar(cdot,5u#,v_center(7u#));
  342. adjust_fit(0,0); pickup fine.nib;
  343. numeric dot_diam#; dot_diam#=if monospace: 5/4 fi\\ dot_size#;
  344. define_whole_blacker_pixels(dot_diam);
  345. pos1(dot_diam,0); pos2(dot_diam,90);
  346. lft x1l=hround(.5w-.5dot_diam); y1+.5dot_diam=vround(math_axis+.5dot_diam);
  347. z1=z2; dot(1,2);  % dot
  348. penlabels(1,2); endchar;
  349.  
  350. iff known diamond: cmchar "Diamond operator";
  351. beginchar(diamond,9u#,v_center(7u#));
  352. italcorr math_axis#*slant;
  353. adjust_fit(0,0); pickup rule.nib;
  354. numeric a; a=(lft 3.5u)*sqrt(3.14159/2); % an attempt to match circle area
  355. x4=x8=good.x .5w; w:=r:=2x4; x2=w-x6=good.x(x4+a);
  356. y2=y6=.5[y4,y8]=math_axis; y8=good.y(y2+a);
  357. draw z2--z4--z6--z8--cycle;  % bowl
  358. labels(2,4,6,8); endchar;
  359.  
  360. iff known left_brace: cmchar "Left curly brace";
  361. beginchar(left_brace,9u#,body_height#,paren_depth#);
  362. italcorr body_height#*slant+.5vair#-u#;
  363. adjust_fit(0,0); pickup fine.nib;
  364. forsuffixes $=1,1',4,4',7,7': pos$(vair,0); endfor
  365. forsuffixes $=2,3,5,6: pos$(stem,0); endfor
  366. x2=x3=x5=x6; x1=x1'=x7=x7'=w-x4=w-x4';
  367. lft x4l=hround(1.5u-.5vair); lft x2l=hround(.5w-.5stem);
  368. top y1=h; bot y7=-d; .5[y4,y4']=.5[y1,y7]=.5[y2,y6]=.5[y3,y5];
  369. y1-y2=y3-y4=(y1-y4)/4; y1-y1'=y4-y4'=y7'-y7=vair-fine;
  370. filldraw z1l{left}...z2l---z3l...{left}z4l
  371.  --z4'l{right}...z5l---z6l...{right}z7l
  372.  --z7r--z7'r{left}...z6r---z5r...{left}.5[z4r,z4'r]{right}
  373.  ...z3r---z2r...{right}z1'r--z1r--cycle;  % stroke
  374. penlabels(1,2,3,4,5,6,7); endchar;
  375.  
  376. iff known right_brace: cmchar "Right curly brace";
  377. beginchar(right_brace,9u#,body_height#,paren_depth#);
  378. italcorr math_axis#*slant+.5vair#-u#;
  379. adjust_fit(0,0); pickup fine.nib;
  380. forsuffixes $=1,1',4,4',7,7': pos$(vair,0); endfor
  381. forsuffixes $=2,3,5,6: pos$(stem,0); endfor
  382. x2=x3=x5=x6; x1=x1'=x7=x7'=w-x4=w-x4';
  383. rt x4r=hround(w-1.5u+.5vair); rt x2r=hround(.5w+.5stem);
  384. top y1=h; bot y7=-d; .5[y4,y4']=.5[y1,y7]=.5[y2,y6]=.5[y3,y5];
  385. y1-y2=y3-y4=(y1-y4)/4; y1-y1'=y4-y4'=y7'-y7=vair-fine;
  386. filldraw z1r{right}...z2r---z3r...{right}z4r
  387.  --z4'r{left}...z5r---z6r...{left}z7r
  388.  --z7l--z7'l{right}...z6l---z5l...{right}.5[z4l,z4'l]{left}
  389.  ...z3l---z2l...{left}z1'l--z1l--cycle;  % stroke
  390. penlabels(1,2,3,4,5,6,7); endchar;
  391.  
  392. iff known straight_quotes: cmchar "Straight double quotes";
  393. beginchar(straight_quotes,9u#,asc_height#,0);
  394. numeric top_width#,spread#; top_width#=if serifs: flare# else: stem# fi;
  395. spread#=max(3u#,top_width#+.5u#); define_pixels(spread);
  396. italcorr asc_height#*slant+.5top_width#+.5spread#-4u#;
  397. adjust_fit(0,0);
  398. x1=x2; x3=x4=w-x1; x3-x1=spread+2; y1=y3;
  399. y2=y4=max(.5[bar_height,x_height]+.5vair,h-x_height);
  400. if serifs: pickup crisp.nib; pos1(flare,0); pos2(vair,0);
  401.  pos3(flare,0); pos4(vair,0);
  402.  y1+.5stem=h; filldraw circ_stroke z1e--z2e;  % left stem and bulb
  403.  filldraw circ_stroke z3e--z4e;  % right stem and bulb
  404. else: pickup fine.nib; pos1(stem,0); pos2(vair,0);
  405.  pos3(stem,0); pos4(vair,0);
  406.  top y1=h; filldraw stroke z1e--z2e;  % left stem
  407.  filldraw stroke z3e--z4e; fi  % right stem
  408. penlabels(1,2,3,4); endchar;
  409.  
  410. iff known infty: cmchar "Infinity";
  411. beginchar(infty,18u#,x_height#,0);
  412. italcorr .7x_height#*slant-.5u#;
  413. adjust_fit(0,0); pickup fine.nib;
  414. numeric theta,phi;
  415. if monospace: phi=-theta=90;
  416. else: phi=angle(4u,h); theta=angle(6u,-h); fi
  417. pos1(vair,180); pos2(.5[vair,curve],90+.5theta); pos3(curve,90+theta);
  418. pos4(curve,90+theta); pos5(.5[vair,curve],90+.5theta);
  419. pos6(vair,180); pos7(.2[vair,curve],270+.5phi);
  420. pos8(.3[vair,curve],270+phi); pos9(.2[vair,curve],270+.5phi);
  421. lft x1r=w-rt x6l=hround u; x2=x9=.4[x1,x8]; x5=x7=.6[x8,x6];
  422. if monospace: x2l:=x2r; x5r:=x5l; x7r:=x7l; x9l:=x9r; fi
  423. y1=y6=.5h; top y2r=top y7l=h+oo; bot y5l=bot y9r=-oo;
  424. x8=.5[x3,x4]=.5w; y8=.5[y3,y4]=.5h;
  425. y3-y4=h/3; z3-z4=whatever*dir theta;
  426. filldraw stroke z1e{up}...z2e{right}...z3e---z4e...z5e{right}
  427.  ...z6e{up}...z7e{left}...{-dir phi}z8e...{left}z9e...z1e{up}; % bowls
  428. penlabels(1,2,3,4,5,6,7,8,9); endchar;
  429.  
  430. iff known integral: cmchar "Integral sign";
  431. beginchar(integral,5.25u#+max(1.25u#,stem#)+2max(1.5u#,curve#),
  432.  asc_height#,desc_depth#);
  433. italcorr asc_height#*slant-.5u#;
  434. adjust_fit(0,0); pickup fine.nib;
  435. pos1(curve,0); pos2(hair,0); pos3(vair,90); pos4(.6[hair,stem],180);
  436. pos5(stem,180); pos5'(stem,0); z5'=z5; pos6(.6[hair,stem],0);
  437. pos7(vair,-90); pos8(hair,-180); pos9(curve,-180);
  438. x7=w-x3=2.4u; rt x1r=max(rt x3+eps,hround(w-u)); x9=w-x1;
  439. x5=.5[x4,x6]; x4-x6=1.5u; lft x5r=hround(.5w-.5stem);
  440. y9-.5curve=vround(-.9d-o+vair); y3-y1=y9-y7;
  441. top y3r=h+o; bot y7r=-d-o; y5=.5[y3,y7]=.5[y4,y6]; y4-y6=2/3(y3-y7);
  442. bulb(3,2,1); bulb(7,8,9);  % bulbs
  443. filldraw stroke z3e{left}...z4e{(z5e-z4e)xscaled 1.1}
  444.  ..tension atleast 1 and atleast .8..{z5-z4}z5e;  % upper stem
  445. filldraw stroke z5'e{z6-z5}..tension atleast.8 and atleast 1
  446.  ..{(z6e-z5'e)xscaled 1.1}z6e...{left}z7e;  % lower stem
  447. math_fit(0,-2u#); penlabels(1,2,3,4,5,6,7,8,9); endchar;
  448.